<template>
  <h1>当前求和为：{{ sum }}</h1>
  <button @click="sum++">点我加1</button>
  <hr />
  <h1>当前信息为：{{ msg }}</h1>
  <button @click="msg += '!'">增加感叹号</button>
  <hr />
  <h1>姓名：{{ person.name }}</h1>
  <h1>年龄：{{ person.age }}</h1>
  <h1>薪资：{{ person.job.j1.salary }}w</h1>
  <button @click="person.name += '~'">增加波浪线</button>
  <button @click="person.age++">增长年龄</button>
  <button @click="person.job.j1.salary++">加薪</button>
</template>

<script>
import { ref, watch, reactive } from "vue";

export default {
  name: "Demo",
  setup() {
    //定义数据
    let sum = ref(0);
    let msg = ref("你好啊");
    const person = reactive({
      name: "李文泰",
      age: 20,
      job: {
        j1: {
          salary: "20",
        },
      },
    });

    // //情况一 监视ref定义的一个响应式数据
    // watch(
    //   sum,
    //   (newValue, oldValue) => {
    //     console.log("sum改变啦", newValue, oldValue);
    //   },
    //   { immediate: true }
    // );

    // //情况二 监视ref定义的多个响应式数据
    // watch([sum, msg], (newValue, oldValue) => {
    //   console.log("sum或msg变化了", newValue, oldValue);
    // });

    // //情况三 监视reactive定义的响应式数据中的全部属性
    // //注意:①此处无法正确获取oldValue
    // //     ②强制开启了深度监视
    // watch(person, (newValue, oldValue) => {
    //   console.log("person变化了", newValue, oldValue);
    // });

    // //情况四：监视reactive定义的响应式数据中的某个属性
    // watch(
    //   () => {
    //     return person.age;
    //   },
    //   (newValue, oldValue) => {
    //     console.log("person的age变化了", newValue, oldValue);
    //   }
    // );

    // //情况五：监视reactive定义的响应式数据中的某些属性
    // watch(
    //   [
    //     () => {
    //       return person.name;
    //     },
    //     () => {
    //       return person.age;
    //     },
    //   ],
    //   (newValue, oldValue) => {
    //     console.log("person的name或age变化了", newValue, oldValue);
    //   }
    // );

    // //特殊情况
    // watch(
    //   () => {
    //     return person.job;
    //   },
    //   (newValue, oldValue) => {
    //     console.log("person的job变化了", newValue, oldValue);
    //   },
    //   { deep: true }
    // ); //此处由于监视的是reactive素定义的对象中的某个属性，所以deep配置有效

    //返回对象
    return {
      sum,
      msg,
      person,
    };
  },
};
</script>

<style>
</style>
